package com.smartisee.springcloud.entities;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * @Auther: sp
 * @Date: 2019/1/29 14:35
 * @Description: 利用lombok
 */

/**
 * Lombok的目的是减少代码的重复编写，并提供比较好的解决方案。当然也存在一些争议性的注解，可以根据实际场景进项使用。
 *
 * @Getter和@Setter 该注解使用在类或者属性上，该注解可以使用在类上也可以使用在属性上。生成的getter遵循布尔属性的约定。例如：boolean类型的sex,getter方法为isSex而不是getSex
 * @NonNull 该注解使用在属性上，该注解用于属的非空检查，当放在setter方法的字段上，将生成一个空检查，如果为空，则抛出NullPointerException。
 * 该注解会默认是生成一个无参构造。
 * @toString 该注解使用在类上，该注解默认生成任何非讲台字段以名称-值的形式输出
 * @EqualsAndHashCode 该注解使用在类上，该注解在类级别注释会同时生成equals和hashCode
 * @RequiredArgsConstructor 该注解使用在类上，使用类中所有带有 @NonNull 注解的或者带有 final 修饰的成员变量生成对应的构造方法。
 * @Value 这个注解用在 类 上，会生成含所有参数的构造方法，get 方法，此外还提供了equals、hashCode、toString 方法。
 * 注意：没有setter；；；
 * @Cleanup 该注解使用在属性前，该注解是用来保证分配的资源被释放。在本地变量上使用该注解，任何后续代码都将封装在try/finally中，确保当前作用于中的资源被释放。默认@Cleanup清理的方法为close，可以使用value指定不同的方法名称。
 * @Synchronized 该注解使用在类或者实例方法上，Synchronized在一个方法上，使用关键字可能会导致结果和想要的结果不同，因为多线程情况下会出现异常情况。
 * @SneakyThrows 该注解使用在方法上，这个注解用在 方法 上，可以将方法中的代码用 try-catch 语句包裹起来，捕获异常并在 catch 中用 Lombok.sneakyThrow(e) 把异常抛出，可以使用 @SneakyThrows(Exception.class) 的形式指定抛出哪种异常。
 */

@SuppressWarnings("serial") //用于抑制编译器产生警告信息
@AllArgsConstructor
//会生成一个包含所有变量，同时如果变量使用了NotNull annotation ， 会进行是否为空的校验，全部参数的构造函数的自动生成，该注解的作用域也是只有在实体类上，参数的顺序与属性定义的顺序一致。
@NoArgsConstructor //无参构造函数
@Data //该注解使用在类上，该注解会提供getter、setter、equals、canEqual、hashCode、toString方法。
@Accessors(chain = true) //使用链式设置属性，set方法返回的是this对象。
public class Dept implements Serializable { // Dept(Entity) orm mysql->Dept(table) 类表关系映射
    private Long deptno; //主键
    private String dname; //部门名称
    private String db_source; //来自哪个数据库，因为微服务架构可以一个服务对应一个数据库，同一个信息被存储到不同的数据库

    public Dept(String dname) {
        super();
        this.dname = dname;
    }

    public static void main(String[] args) {
        Dept dept = new Dept();
        dept.setDeptno(11L).setDname("RD").setDb_source("DB01");
    }


    //
//    public Dept() {
//        super();
//    }
//
//    public Dept(Long deptno, String dname, String db_source) {
//        super();
//        this.deptno = deptno;
//        this.dname = dname;
//        this.db_source = db_source;
//    }
//
//    public Long getDeptno() {
//        return deptno;
//    }
//
//    public void setDeptno(Long deptno) {
//        this.deptno = deptno;
//    }
//
//    public String getDname() {
//        return dname;
//    }
//
//    public void setDname(String dname) {
//        this.dname = dname;
//    }
//
//    public String getDb_source() {
//        return db_source;
//    }
//
//    public void setDb_source(String db_source) {
//        this.db_source = db_source;
//    }
//
//    @Override
//    public String toString() {
//        return "Dept{" +
//                "deptno=" + deptno +
//                ", dname='" + dname + '\'' +
//                ", db_source='" + db_source + '\'' +
//                '}';
//    }
}
